openssl 命令
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
OpenSSL 整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。
随机数
openssl rand -out rand.dat -base64 32
生成的 rand.dat 文件
76w1VjaUlnDq5mvUheFnGCVtmKklRdOW2nOcNGF5oH4=
密钥操作
RSA
openssl genrsa -out rsa.key 2048(私钥不带密码)
openssl genrsa -out rsa.key -aes256 -passout pass:123456 2048(私钥带密码)
ecparam
openssl ecparam -name CN-GM-ECC -out sm2.param
openssl ecparam -in sm2.param -out sm2.key -genkey -noout
genpkey
openssl genpkey -algorithm RSA -out rsa.key -pkeyopt rsa_keygen_bits:2048
openssl genpkey -parafile sm2.param -out sm2.key
不带密码的私钥==>带密码的私钥
openssl rsa -in rsa.key -out xxx.key -aes256 -passout pass:123456
openssl ec -in sm2.key -out xxx.key -sm4 -passout pass:123456
带密码的私钥==>不带密码的私钥
openssl rsa -in xxx.key -passin pass:123456 -out yyy.key
openssl ec -in xxx.key -passin pass:123456 -out yyy.key
pkey加解密私钥
openssl pkey -in rsa.key -out rsa_enc.key -des3 -passout pass:1234
openssl pkey -in rsa_enc.key -out rsa.key -passin pass:1234
从密钥对提取公钥
openssl rsa -in chen.key -pubout -out chen_pub.key
私钥公钥的使用
产生 1024 位 RSA 私匙,用 3DES 加密它,口令为 trousers,输出到文件 rsaprivatekey.pem
openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024
从文件 rsaprivatekey.pem 读取私匙,用口令 trousers 解密,生成的公钥匙输出到文件 rsapublickey.pem
openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem
用公钥匙 rsapublickey.pem 加密文件 plain.txt,输出到文件 cipher.txt
openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt
使用私钥匙 rsaprivatekey.pem 解密密文 cipher.txt,输出到文件 plain.txt
openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt
用私钥匙 rsaprivatekey.pem 给文件 plain.txt 签名,输出到文件 signature.bin
openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin
用公钥匙 rsapublickey.pem 验证签名 signature.bin,输出到文件 plain.txt
openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain
证书的使用 ⭐
从 X.509 证书文件 cert.pem 中获取公钥匙,用 3DES 加密 mail.txt,输出到文件 mail.enc
openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem
从 X.509证书文件 cert.pem 中获取接收人的公钥匙,用私钥匙 key.pem 解密 S/MIME 消息 mail.enc,结果输出到文件 mail.txt
openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt
cert.pem 为 X.509 证书文件,用私匙 key.pem 为 mail.txt 签名,证书被包含在 S/MIME 消息中,输出到文件 mail.sgn
openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn
验证 S/MIME 消息 mail.sgn,输出到文件 mail.txt,签名者的证书应该作为 S/MIME 消息的一部分包含在 mail.sgn 中
openssl smime -verify -in mail.sgn -out mail.txt
摘要算法
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
举个例子,你写了一篇文章,内容是一个字符串 'how to use pythonhashlib - by Michael'
,并附上这篇文章的摘要是 '2d73d4f15c0db7f5ecb321b6a65e5d6d'
。
如果有人篡改了你的文章,并发表为 'how to usepython hashlib - by Bob'
,你可以一下子指出 Bob 篡改了你的文章,因为根据 'how to usepython hashlib - by Bob'
计算出的摘要不同于原始文章的摘要。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过 digest 反推 data 却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
摘要算法 主要有 SHA-1、MD5 等。
直接做摘要
对 plain.txt
文件做摘要
openssl dgst -sha1 -out dgst.dat plain.txt
对摘要进行签名/验签
先做摘要,然后对摘要进行签名/验签,下面的 priv.key
和 pub.key
分别是私钥和公钥
签名摘要
openssl dgst -sha1 -sign priv.key -out sig.dat plain.txt
验签摘要
openssl dgst -sha1 -verify pub.key -signature sig.dat plain.txt
对称加密
块密码算法也叫分组密码算法,从字面意思就可以知道,它把加密和解密序列分成了一个个分组,最后把每一块序列合并到一起,形成明文或者密文。根据不同的分组加密方式,每个分组之间可以有联系,也可以没有联系
流密码算法,或者叫序列密码,算法大概的原理是,每次加密都通过密钥生成一个密钥流,解密也是使用同一个密钥流,明文与同样长度的密钥流进行异或运算得到密文,密文与同样的密钥流进行异或运算得到明文。
块密码和流密码是使用对称加密算法加密数据的两种独立方法:
- 分块加密信息:分组密码将明文消息分解为固定大小的块,然后使用密钥将其转换为密文。
- 逐位加密信息:另一方面,流密码将明文消息分解为单个位,然后使用密钥位将其分别转换为密文。
块加密
加密
openssl enc -sm4 -K "0123456789abcdeffedcba9876543210" -iv "12345678123456781234567812345678" -e -in plain.txt -out encrypted.dat
解密
openssl enc -sm4 -K "0123456789abcdeffedcba9876543210" -iv "12345678123456781234567812345678" -d -in encrypted.dat -out decrypted.dat
流加密
加密
openssl enc -rc4 -a -K 0000000000000000 -in plain.dat -out encrypted.dat
解密
openssl enc -d -rc4 -a -K 0000000000000000 -in encrypted.dat -out decrypted.dat
非对称加密
签名
openssl pkeyutl -sign -inkey rsa.key -in rsa.dat -out sign.dat
验签
openssl pkeyutl -verify -certin -inkey rsa.pem -in rsa.dat -sigfile sign.dat
openssl pkeyutl -verify -inkey rsa.key -in rsa.dat -sigfile sign.dat
加密
openssl pkeyutl -encrypt -inkey rsa.key -in rsa.dat -out enc.dat
解密
openssl pkeyutl -decrypt -inkey rsa.key -in enc.dat -out source.dat
证书请求
生成证书请求
需要手动输入一些证书项,如 CN,email 等
# 先使用 RSA 算法生成私钥
openssl genrsa -out mysite.key 2048
# 生成证书请求
openssl req -key mysite.key -new -out mysite.req -sha1 -utf8
# 私钥带密码的情况
openssl req -key mysite.key -passin pass:123456 -new -out mysite.req -sha1 -utf8
这个 req 是 X.509证书签发请求
X.509 是用于的标准格式 公钥证书,是将加密密钥对与网站,个人或组织等身份安全地关联的数字文档。
自定义信息
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:XxXx
Locality Name (eg, city) []:XxXx
Organization Name (eg, company) [Internet Widgits Pty Ltd]:XX Co. Ltd
Organizational Unit Name (eg, section) []:Dev
Common Name (e.g. server FQDN or YOUR name) []:server name
Email Address []:xxx@xxx.com
验证请求
openssl req -verify -in mysite.req -noout
解析请求
openssl req -in mysite.req -text
签发证书
CA根证书
openssl x509 -req -days 3650 -in rootca.req -signkey rootca.key -out rootca.pem -passin pass:xxxx(私钥带密码的情况) -CAcreateserial
用户证书
openssl x509 -req -in user.req -CA rootca.pem -CAkey rootca.key -out user.pem -passin pass:12345678 v3_req -CAcreateserial -days 3650